﻿#pragma 
#ifndef PHOTOSHOP_ALGORITHM_H
#define PHOTOSHOP_ALGORITHM_H
#include <opencv2/opencv.hpp>
#include <chrono>
#include <iostream>
#include <string>
#include <vector>


inline int MAX_CUST(int a, int b) { return (a > b) ? a : b; }
inline int MIN_CUST(int a, int b) { return (a < b) ? a : b; }
inline int CLAMP(int a) { return a < 0 ? 0 : (a > 255 ? 255 : a);}
inline int DEGREE_100_100(int a) { return a < -100 ? -100 : (a > 100 ? 100 : a);}
inline int DEGREE_1_100(int a) { return a < 1 ? 1 : (a > 100 ? 100 : a);}
inline int DEGREE_1_32(int a) { return a < 1 ? 1 : (a > 32 ? 32 : a);}
inline int COLOR_255_255(int a) { return a < -255 ? -255 : (a > 255 ? 255 : a);}
inline int COLOR_0_255(int a) { return a < 0 ? 0 : (a > 255 ? 255 : a);}

/*
*计时函数（宏），用于计算函数运行耗时
*/

#define MEASURE_TIME(func, description) do { \
    auto start = std::chrono::high_resolution_clock::now(); \
    func; \
    auto end = std::chrono::high_resolution_clock::now(); \
    std::chrono::duration<double> duration = end - start; \
    std::cout << description << ": " << duration.count() << " seconds" << std::endl; \
} while (0)


namespace PhotoShop {

	/* 计时函数，用于计算函数运行耗时 */
	void measureTime(const std::function<void()>& func, const std::string& description);
	

	/* PS 色彩特效 */
	cv::Mat ColorTrans(cv::Mat src, int op);
	cv::Mat ColorTransPtr(const cv::Mat& src, int op);

	/*
	* PS MinMax运算算法  flag 0:Max 1:Min
	* 由两个矩阵的最大值（最小值）生成新的图像
	*/
	cv::Mat MinMax(cv::Mat src1, cv::Mat src2, int flag);
	cv::Mat MinMaxPtr(const cv::Mat& src1, const cv::Mat& src2, int flag);


	/* PS 八方向浮雕算法 */
	enum class DIR {
		N,
		NE,
		E,
		SE,
		S,
		SW,
		W,
		NW
	};

	cv::Mat DiamondEmboss(cv::Mat src, DIR dir = DIR::SE, int offset = 127);
	cv::Mat DiamondEmbossPtr(const cv::Mat& src, DIR dir = DIR::SE, int offset = 127);


	/* PS二维高斯蒙版算法 */
	cv::Mat GaussDistributionMask(cv::Mat src);
	cv::Mat GaussDistributionMaskPtr(const cv::Mat& src);


	/* PS亮度调节(曝光不足或过量) cb_(-255,255)*/
	cv::Mat Bright(cv::Mat src, int cb_);
	cv::Mat BrightPtr(const cv::Mat& src, int cb_);


	/* PS剪纸艺术滤镜算法 */
	cv::Mat PaperCutArtFilter(const cv::Mat& src);


	/* PS图像平移算法
	*     移出的区域填充255
	* tx：X方向的平移量
	* ty: Y方向的平移量
	* flag: 是否扩大图像，0：不扩大，1：扩大
	*/
	cv::Mat Translate(cv::Mat src, int tx, int ty, bool flag);
	cv::Mat TranslatePtr(const cv::Mat& src, int tx, int ty, bool flag);


	/* PS图像素描算法 */
	cv::Mat Sketch(cv::Mat src);
	cv::Mat SketchPtr(const cv::Mat& src);


	/* PS图像镜像翻转算法 
	*  PS图像转置算法
	*  OpenCV(自带算法)
	*  flag=0：转置
	*  flag=1 水平镜像
	*  flag=-1垂直镜像
	*/
	cv::Mat MirrorTransposition(const cv::Mat& src, int flag);


	/* PS图像错切算法
	*  /flag=1，水平错切; flag=-1, 垂直错切
	*  水平方向: x2=(x1-y1*tan(theta))
	*            y2=y1
	*/
	cv::Mat Slant(const cv::Mat& src, float angle, int flag);
	cv::Mat SlantPtr(const cv::Mat& src, float angle, int flag);


	/* PS对比度增强算法 */
	cv::Mat Contrast(cv::Mat src, int degree);
	cv::Mat ContrastPtr(const cv::Mat& src, int degree);


	/* PS拉普拉斯锐化算法 */
	cv::Mat LaplaceSharp(cv::Mat src);
	cv::Mat LaplaceSharpPtr(const cv::Mat& src);


	/* PS挤压特效算法 
	*  degree代表挤压幅度，在1-32之间
	*/
	cv::Mat Pince(cv::Mat src, int degree);


	/* PS灰度浮雕算法 */
	cv::Mat Emboss(cv::Mat src, float angle = 30, int offset = 127);
	cv::Mat EmbossPtr(const cv::Mat& src, float angle = 30, int offset = 127);


	/* PS算术(加\减\乘\除)
	* 0: Add
	* 1: Subtract
	* 2: Multiply
	* 3: Divide
	*/
	cv::Mat AddSubMulDiv(cv::Mat src1, cv::Mat src2, int flag);


	/* PS自由锐化算法（局部区域锐化算法） */
	cv::Mat FreeSharp(cv::Mat src, float sharpDegree = 0.3);
	cv::Mat FreeSharpPtr(const cv::Mat& src, float sharpDegree = 0.3);

	/* PS色彩均衡化算法*/
	cv::Mat Equalizer(cv::Mat src);
	cv::Mat EqualizerPtr(const cv::Mat& src);

	/* PS色彩平衡(偏色校正) */
	cv::Mat ColorBalance(cv::Mat src, int cR, int cG, int cB);
	cv::Mat ColorBalancePtr(const cv::Mat& src, int cR, int cG, int cB);


	/* PS色调均化滤镜算法 */
	cv::Mat Equalize(cv::Mat src);
	cv::Mat EqualizePtr(const cv::Mat& src);


	/* PS调和浮雕算法 */
	cv::Mat Harmonic(cv::Mat src, int offset = 127);
	cv::Mat HarmonicPtr(const cv::Mat& src, int offset = 127);


	/* PS负像算法 */
	cv::Mat Invert(cv::Mat src);
	cv::Mat InvertPtr(const cv::Mat& src);


	/* PS连环画算法 */
	cv::Mat ComicStrips(cv::Mat src);

	/* PS钝化蒙版算法
	* degree:钝化度，取值（0~100）
	* 钝化度用来改变像素间的对比度强弱，钝化值越小，钝化的部分就越窄，仅仅会影响边缘像素
	* 钝化值越大，钝化的范围越宽，效果更明显
	*/
	cv::Mat UnsharpMask(cv::Mat src, int degree);


	/* PS马赛克算法 */
	cv::Mat Masic(cv::Mat src, int Ksize);
	cv::Mat MasicPtr(const cv::Mat& src, int Ksize);


	/* PS高反差保留算法 */
	cv::Mat HighPass(cv::Mat src);
	cv::Mat HighPassPtr(const cv::Mat& src);



	/* PS模糊滤镜之中值模糊 */
	cv::Mat MedianFilter(cv::Mat src, int ksize = 5);
	cv::Mat MedianFilterPtr(const cv::Mat& src, int ksize = 5);



	/* PS模糊滤镜之平滑算法(均值滤波) */
	cv::Mat TemplateBlur(cv::Mat src);
	cv::Mat TemplateBlurPtr(const cv::Mat& src);


	/* PS模糊滤镜之径向模糊算法(旋转与缩放) */
	cv::Mat RadialBlurRotate(cv::Mat src, int num = 10);
	cv::Mat RadialBlurRotatePtr(const cv::Mat& src, int num = 10);
	cv::Mat RadialBlurZoom(cv::Mat src, int num = 10);
	cv::Mat RadialBlurZoomPtr(const cv::Mat& src, int num = 10);

	/* PS模糊滤镜之水波效果算法 */
	cv::Mat WaveFilter(cv::Mat src);

	/* PS模糊滤镜之融化效果 */
	cv::Mat ColorClot(cv::Mat src, int radius);
	cv::Mat ColorClotPtr(const cv::Mat& src, int radius);

	/* PS模糊滤镜之表面模糊算法 */
	cv::Mat SurfaceBlur(cv::Mat src, int radius);
	cv::Mat SurfaceBlurPtr(cv::Mat src, int radius);


	/* PS模糊滤镜之运动模糊 */
	cv::Mat MotionBlur(const cv::Mat& src, int angle = 30, int distance = 100);
	cv::Mat MotionBlurPtr(const cv::Mat& src, int angle = 30, int distance = 100);


	/* PS模糊滤镜之高斯模糊 */
	cv::Mat GaussBlur(cv::Mat src, int kSize, float sigma);
	cv::Mat GaussBlurPtr(cv::Mat src, int kSize, float sigma);

};






#endif //!PHOTOSHOP_ALGORITHM_H
 